/* IF2030 - Algorirma dan Struktur Data */
/* Kelas/Kelompok/Tahun  : 03/09/2011 */
/* Tanggal   : 2 Desember 2011 */
/* File      : mesinargumen.c */
/* Deskripsi : Mesin Argumen untuk pemecah string argumen */

#include "../mesinargumen/mesinargumen.h"
boolean EndArg;
string CArg;

void IgnoreBlank()
/* Mengabaikan satu atau beberapa BLANK
I.S. : CC sembarang
F.S. : CC != BLANK atau CC = MARK */
{
    /* Kamus Lokal */
    /* Algoritma */
    while ((CC == BLANK) && (CC != MARK)) {
        ADV();
    } /* CC != BLANK or CC = MARK */
}

void STARTARG(line str)
/* I.S. : CC sembarang
F.S. : EndArg = true, dan CC = Mark;
atau EndArg = false, CArg adalah kata yang sudah
diakuisisi,
CC karakter pertama sesudah karakter terakhir kata */
{
    /* Kamus Lokal */
    /* Algoritma*/
    START(str);
    IgnoreBlank();
    if (CC == MARK) {
        CArg[0] = '\0';
        EndArg = true;
    } else { /* CC != MARK */
        EndArg = false;
        ADVARG();
    }
}

void ADVARG()
/* I.S. : CC adalah karakter pertama kata yang akan diakuisisi
F.S. : CArg adalah kata terakhir yang sudah diakuisisi,
CC adalah karakter pertama dari kata berikutnya,
mungkin MARK
Proses : Akuisisi kata menggunakan procedure SalinArg */
{
    /* Kamus Lokal */
    /* Algoritma*/
    if ((CC == MARK) || (CC == '\0') || (CC == '\n')) {
        EndArg = true;
        strcopy(CArg, ""); /* Menghilangkan isi CArg akibat sudah mencapai EndArg */
    } else { /* CC != MARK */
        SalinArg();
        IgnoreBlank();
    }
}

void SalinArg()
/* Mengakuisisi kata, menyimpan dalam CArg
I.S. : CC adalah karakter pertama dari kata
F.S. : CArg berisi kata yang sudah diakuisisi;
CC = BLANK atau CC = MARK;
CC adalah karakter sesudah karakter terakhir yang
diakuisisi */
{
    /* Kamus Lokal */
    int i = 0; /* inisialisasi */
    char CStart;

    /* Algoritma*/
    CStart = CC;
    for (;;) {
        if (CC != '"') {
            CArg[i] = CC;
        } else  {
            i--;
        }

        ADV();


        if ((CC == MARK) || (CC == '\0') || (CC == 13) || ((CStart != '"') && (CC == BLANK)) || ((CStart == '"') && (CC == '"'))) {
            if (CC == '"') {
                ADV();
            }
            break;
        } else {
            i++;
        }
    } /* CC = MARK or CC = BLANK */
    CArg[i+1] = '\0';

    /* Mengabaikan NIL tanpa tanda kutip */
    if ((CStart == 'N') && (strcompare(CArg, "NIL") == 0)) {
        strcopy(CArg, "");
    }
}
